import axios from 'axios';

// 创建一个专用的axios实例，配置基本参数
const iconAxios = axios.create({
  baseURL: import.meta.env.VITE_API,
  timeout: 15000, // 15秒超时
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
});

// 请求拦截器 - 处理请求前的配置
iconAxios.interceptors.request.use(
  config => {
    // 可以在这里添加认证信息等
    console.log('发送请求:', config.url, config.data);
    return config;
  },
  error => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器 - 处理响应数据和错误
iconAxios.interceptors.response.use(
  response => {
    // 只返回响应的数据部分
    console.log('请求成功:', response.config.url, response.data);
    return response.data;
  },
  error => {
    // 处理错误情况
    console.error('响应错误:', error);
    
    // 如果有响应但状态码不是2xx
    if (error.response) {
      console.error('错误状态:', error.response.status);
      console.error('错误数据:', error.response.data);
    } else if (error.request) {
      // 请求已发送但没有收到响应
      console.error('未收到响应:', error.request);
    } else {
      // 请求设置时发生错误
      console.error('请求配置错误:', error.message);
    }
    
    // 返回一个带有错误信息的对象，而不是直接抛出错误
    return {
      code: error.response?.status || 500,
      msg: '请求失败',
      error: error.message,
      data: null
    };
  }
);

/**
 * 楼宇标签API类
 */
class BuildingLabelAPI {
  /**
   * 获取楼宇标签数据
   * @param {string} labelName - 楼宇名称，例如"合肥博讯1#楼"
   * @param {number} sceneId - 场景ID，默认为72
   * @returns {Promise<Object>} 返回楼宇标签数据
   */
  async getBuildingLabelData(labelName, sceneId = 68) {
    try {
      // 确保labelName有值
      if (!labelName) {
        console.warn('楼宇名称为空，使用默认值');
        labelName = "合肥博讯1#楼";
      }
      
      // 构建请求数据
      const requestData = {
        sceneId: sceneId,
        labelName: labelName
      };
      
      console.log(`正在请求楼宇数据: ${labelName}, sceneId: ${sceneId}`);
      
      // 使用iconAxios发送POST请求，使用环境变量中的API基础URL
      const response = await iconAxios.post('/api/Read/GetDemoBuildLableDat', requestData);
      
      // 返回响应
      return response;
    } catch (error) {
      console.error('获取楼宇标签数据失败:', error);
      
      // 返回模拟数据作为备用，确保应用不会崩溃
      return {
        data: this.getFallbackData(labelName, sceneId)
      };
    }
  }
  
  /**
   * 获取格式化的楼宇标签数据
   * @param {string} labelName - 楼宇名称
   * @param {number} sceneId - 场景ID，默认为72
   * @returns {Promise<Array>} 返回格式化的楼宇标签数据数组
   */
  async getFormattedBuildingData(labelName, sceneId = 68) {
    try {
      const response = await this.getBuildingLabelData(labelName, sceneId);
      const buildingData = response.data;
      
      if (buildingData && Array.isArray(buildingData.data)) {
        return buildingData.data.map(item => ({
          title: item.atrName,
          value: item.valText
        }));
      }
      return [];
    } catch (error) {
      console.error('获取格式化楼宇数据失败:', error);
      return [];
    }
  }
  
  /**
   * 获取备用数据（当API请求失败时使用）
   * @param {string} labelName - 楼宇名称
   * @param {number} sceneId - 场景ID
   * @returns {Object} 模拟的楼宇标签数据
   */
  getFallbackData(labelName, sceneId = 68) {
    console.log(`使用备用数据: ${labelName}, sceneId: ${sceneId}`);
    return {
      code: 200,
      date: new Date().toISOString().replace('T', ' ').substring(0, 19),
      msg: "操作成功(模拟数据)",
      data: [
        {
          mName: "楼宇标签",
          pName: labelName || "合肥博讯1#楼",
          sceneId: sceneId,
          mId: 3,
          palId: 13,
          atrName: "总产值",
          valText: "250万吨",
          valFloat: null,
          valPic: null,
          valVideo: "0",
          valHtml: null,
          deleteStatus: 0,
          datType: 2
        },
        {
          mName: "楼宇标签",
          pName: labelName || "合肥博讯1#楼",
          sceneId: sceneId,
          mId: 3,
          palId: 13,
          atrName: "年产值",
          valText: "320 万吨",
          valFloat: null,
          valPic: null,
          valVideo: "0",
          valHtml: null,
          deleteStatus: 0,
          datType: 2
        },
        {
          mName: "楼宇标签",
          pName: labelName || "合肥博讯1#楼",
          sceneId: sceneId,
          mId: 3,
          palId: 13,
          atrName: "日产量",
          valText: "160 万吨",
          valFloat: null,
          valPic: null,
          valVideo: "0",
          valHtml: null,
          deleteStatus: 0,
          datType: 2
        }
      ]
    };
  }
  
  /**
   * 处理楼宇数据，转换为更易用的格式
   * @param {Object} response - API响应数据
   * @returns {Object} 处理后的数据
   */
  processData(response) {
    if (!response || !response.data || response.code !== 200) {
      return { success: false, data: null };
    }
    
    // 将数据转换为更易用的格式
    const processedData = {
      success: true,
      buildingName: response.data[0]?.pName || '',
      attributes: {}
    };
    
    // 将属性数组转换为对象格式，便于访问
    response.data.forEach(item => {
      processedData.attributes[item.atrName] = {
        value: item.valText || '',
        type: item.datType
      };
    });
    
    return processedData;
  }
}

// 创建单例实例
const buildingLabelAPI = new BuildingLabelAPI();

// 导出API实例
export default buildingLabelAPI;

// 也可以导出类，以便在需要时创建新实例
export { BuildingLabelAPI };
